# -*- coding: UTF-8 -*-
from Partie import *
from PlancheDeJeu.PlancheDeJeu import *
from Chat.ClientChat import *
from Vue import *
from FinDePartie import *
import MiniJeux.FrogShooter.FrogShooter as FrogShooter
import MiniJeux.FrogDance.Controleur as CFrogDance
import MiniJeux.FrogDance.VueFrogDance as VFrogDance
import MiniJeux.FrogLab.FrogLabControleur as CFrogLab
import MiniJeux.FrogLab.FrogLabVue as VFrogLab
import MiniJeux.FrogMouches.Controleur as CFrogMouches
import MiniJeux.FrogMouches.VueJeuDeMouches as VFrogMouches
import Highscore.VueHighscore as VH
from PlancheDeJeu.Joueur import *
import tkMessageBox
import Pyro.core
import sys
import time

class Client():
    def __init__(self, controleur, adresse, nom):
        self.controleur = controleur
        self.adresse = adresse
        self.nomDuJoueur = nom
        self.erreur = None
        
        try: 
            self.clientChat = ClientChat(adresse, self.nomDuJoueur)
            if adresse:
                self.partie = Pyro.core.getProxyForURI("PYROLOC://"+adresse+"/PartieReseau")
            else:
                self.partie = Partie(1,self.clientChat.chat)
            self.id = self.partie.creerJoueur(self.nomDuJoueur)
        except PartieStartedError:
            self.erreur = 'FATAL_ERROR'
            tkMessageBox.showwarning("Erreur", "Désolé, cette partie est déjà commencée!")
            return
        except InvalidNameError:
            self.erreur = 'USERNAME_ERROR'
            tkMessageBox.showwarning("Erreur", "Désolé, le nom choisi est invalide!")
            return
        except DuplicateNameError: #Deja un nom utilisé
            self.erreur = 'USERNAME_ERROR'
            tkMessageBox.showwarning("Erreur", "Désolé, un joueur avec ce nom existe déjà!")
            return
        except AttributeError:
            self.erreur = 'USERNAME_ERROR'
            tkMessageBox.showwarning("Erreur", "Vous devez choisir un nom!")
            return
        except: #Deja un nom utilisé
            self.erreur = 'CONNECTION_ERROR'
            tkMessageBox.showwarning("Erreur", "Désolé, impossible de se connecter à la partie!")
            return

        
        pdjTemp = self.partie.getPlancheDeJeu(self.id) #PlancheDeJeu(self.partie, Joueur(nomDuJoueur,Position(7,0)))

        if isinstance(pdjTemp,Pyro.core.PyroURI):
            self.pdj = Pyro.core.getProxyForURI(pdjTemp)
        else:
            self.pdj = pdjTemp
        
        self.jobMiniGameTime = Job(0.5, self.checkIfMiniGame)
        self.jobMiniJeuTermine = Job(0.5, self.isMiniJeuTermine)

    def changerMode(self):
        self.clientChat.nbMessages = 0
        if self.adresse:
            if not self.clientChat.connecte:
                self.clientChat.connecterChatReseau(self.adresse)
            else:
                self.clientChat.deconnecterChatReseau()
    
    def launchMiniGame(self):
        #On ferme la fenetre principale, on crée une vue et on l'affiche, etc...
        #3 3e étape pour ajouter un mini-jeu
        print "start launchMiniGame - Client"
        nom = None
        #If you are the chosen one (ask server who rigered it)
        if(self.partie.isTheChosenOne(self.id)):
            self.controleur.vue.choixMiniJeux = None
            self.controleur.vue.root.after(50, lambda : self.controleur.vue.afficherMenuMiniJeu())
            while(not self.controleur.vue.choixMiniJeux or self.controleur.vue.choixMiniJeux.menuMiniJeuActif):
                time.sleep(1)
                self.partie.getMiniGameName(self.id)
            nom = self.controleur.vue.choixMiniJeux.miniJeuSelected
            self.partie.setMiniGame(nom)
        else:
            self.controleur.vue.root.after(50, lambda : self.controleur.vue.afficherAttenteMiniJeu())
            while not self.partie.getMiniGameName(self.id):
                time.sleep(1)
            
        self.partie.launchMiniJeu(self.id)
        nom = self.partie.getMiniGameName(self.id)
        size = self.controleur.size
        if nom=='FrogShooter':
            self.controleur.vue.root.after(50,lambda : self.goFrogShooter())
            """if self.adresse:
                p = Pyro.core.getProxyForURI("PYROLOC://"+self.adresse+"/PartieFrogShooter")
            else:
                p = self.partie.getMiniJeuEnCours()
            v = FrogShooter.Vue(self.controleur.vue.root, p, size[0], size[1])
            self.controleur.vue.show(v.root)
            controleur=FrogShooter.Controleur(p, v, self.nomDuJoueur)"""
        elif nom=='FrogDance':
            self.controleur.vue.root.after(50,lambda : self.goFrogDance())
            """if self.adresse:
                p = Pyro.core.getProxyForURI("PYROLOC://"+self.adresse+"/PartieFrogDance")
            else:
                p = self.partie.getMiniJeuEnCours()
            v = VFrogDance.VueFrogDance(self.controleur.vue.root, size[0], size[1])
            self.controleur.vue.show(v)
            controleur=CFrogDance.Controleur(self.nomDuJoueur, p, v)"""
        elif nom=='FrogLab':
            self.controleur.vue.root.after(50,lambda : self.goFrogLab())
            """if self.adresse:
                p = Pyro.core.getProxyForURI("PYROLOC://"+self.adresse+"/PartieFrogLab")
            else:
                p = self.partie.getMiniJeuEnCours()
            v = VFrogLab.FrogLabVue(self.controleur.vue.root, size[0], size[1])
            self.controleur.vue.show(v.frame)
            controleur=CFrogLab.FrogLabControleur(self.nomDuJoueur, p, v)"""
        elif nom=='FrogMouches':
            self.controleur.vue.root.after(50,lambda : self.goFrogMouches())
            """if self.adresse:
                p = Pyro.core.getProxyForURI("PYROLOC://"+self.adresse+"/PartieFrogMouches")
            else:
                p = self.partie.getMiniJeuEnCours()
            v = VFrogMouches.VueJeuDeMouches(self.controleur.vue.root, size[0], size[1])
            self.controleur.vue.show(v)
            controleur=CFrogMouches.Controleur(self.nomDuJoueur, p, v)"""

        self.jobMiniJeuTermine.start()
        
    def goFrogShooter(self):
        size = self.controleur.size
        if self.adresse:
            self.p = Pyro.core.getProxyForURI("PYROLOC://"+self.adresse+"/PartieFrogShooter")
        else:
            self.p = self.partie.getMiniJeuEnCours()
        self.v = FrogShooter.Vue(self.controleur.vue.root, self.p, size[0], size[1])
        self.controleur.vue.show(self.v.root)
        self.c=FrogShooter.Controleur(self.p, self.v, self.nomDuJoueur)

    def goFrogDance(self):
        size = self.controleur.size
        if self.adresse:
            self.p = Pyro.core.getProxyForURI("PYROLOC://"+self.adresse+"/PartieFrogDance")
        else:
            self.p = self.partie.getMiniJeuEnCours()
        self.v = VFrogDance.VueFrogDance(self.controleur.vue.root, size[0], size[1])
        self.controleur.vue.show(self.v)
        self.c=CFrogDance.Controleur(self.nomDuJoueur, self.p, self.v)

    def goFrogLab(self):
        size = self.controleur.size
        if self.adresse:
            self.p = Pyro.core.getProxyForURI("PYROLOC://"+self.adresse+"/PartieFrogLab")
        else:
            self.p = self.partie.getMiniJeuEnCours()
        self.v = VFrogLab.FrogLabVue(self.controleur.vue.root, size[0], size[1])
        self.controleur.vue.show(self.v.frame)
        self.c=CFrogLab.FrogLabControleur(self.nomDuJoueur, self.p, self.v)

    def goFrogMouches(self):
        size = self.controleur.size
        if self.adresse:
            self.p = Pyro.core.getProxyForURI("PYROLOC://"+self.adresse+"/PartieFrogMouches")
        else:
            self.p = self.partie.getMiniJeuEnCours()
        self.v = VFrogMouches.VueJeuDeMouches(self.controleur.vue.root, size[0], size[1])
        self.controleur.vue.show(self.v)
        self.c=CFrogMouches.Controleur(self.nomDuJoueur, self.p, self.v)

    def checkIfMiniGame(self):
        if self.partie.isMiniGameTime(self.id):
            print 'MINIGAME TIME'
            self.jobMiniGameTime.stop()
            self.launchMiniGame()

    def isMiniJeuTermine(self):
        #print "aminijeutermine?"
        if self.partie.isMiniJeuTermine(self.id):
            print 'MINIGAME OVER'
            self.controleur.launchPlancheDeJeu()
            if(self.partie.isGameOver()):
                size = self.controleur.size
                if not self.partie.isReseau():
                    VH.modele(self.pdj.getJoueur())
                
                self.vF = FinDePartie(self.controleur.vue.root,size[0], size[1], self.partie)
                self.controleur.vue.show(self.vF.f)
        
    def play(self):
        pass
        #self.jobMiniGameTime.start()
    
    def attendreDebutPartie(self):
        pass
    
    def getErreur(self):
        return self.erreur
        
    def getJoueursDansPartie(self):
        """ Retourne le nombre de joueurs in et le nombre de joueurs total sous forme de tuple. """
        return (self.partie.getNbJoueurs(), self.partie.getNbClients())

if __name__ == '__main__':
    pass